package com.all.ui;

import java.util.Iterator;
import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.all.base.BaseActivity;

public class GpsActivity extends BaseActivity {

	EditText mEditText;
	Location mLocation;
	LocationManager mLocationManager;
	boolean isGpsopen = false; 
	
	Bundle bundle;
	/*
	 * 定位标识
	 * */
	int flag = 2;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_gps);
		bundle = savedInstanceState;
		init();
		gpsLocation();
	}

	private void init() {
		// TODO Auto-generated method stub
		mEditText = (EditText)findViewById(R.id.editText_gps);
	}
	
	public void gpsLocation()
	{
		mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
		mLocationManager.addGpsStatusListener(mGpsListener);
		if(!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
		{
			openGpsActivity();
			return;
		}
		else 
			isGpsopen = true;
		
		/*
		 * 三种定位方式
		 * 1、对gps供应商进行定位，只要有一个成功则返回
		 * 2、设置精确的GPS信息，再获取最好的定位方式
		 * 3、不设置精确GPS信息，但依然获取最好的定位方式
		 * */
		if(flag==0)
		{
			/*	
			 * 获得有效的提供商列表 
			 * 再进行定位
			 * 当我们关闭手机的GPS，返回的列表中没有gps
			 * 当我们开启手机的GPS时，有可能并没有搜索到卫星，这时gps仍出现在有效的供应商列表,但定位时location会返回null
			 * */
			List<String> providerlist  = mLocationManager.getProviders(true);
			if(isGpsopen&&providerlist!=null)
				mLocation = getlocation(providerlist);
		}else if(flag==1)
		{
			/*
			 * 设置精确的Criteria
			 * 通过getBestProvider获得满足要求的最佳供应商，也可以通过getProviders(criteria, true)获取符合要求的供应商列表。
			 * 在没有搜索到足够卫星时，系统会返回其他方式，如network。
			 * 这种情况一般能保证定位成功，特殊情况除外
			 * */
			Criteria criteria = getCriteria();
			String betProvider = mLocationManager.getBestProvider(criteria, true);
			if(isGpsopen&&betProvider!=null)
				mLocation = mLocationManager.getLastKnownLocation(betProvider);
		}else
		{
			/*
			 * 设置我们的标准Criteria，可以用setXXX()，例如criteria.setAccuracy(int);
			 * 提出我具体的要求，例如精度要求等，如果没有什么特别的要求，也就无需进行设置
			 * 通过getBestProvider获得满足要求的最佳供应商，也可以通过getProviders(criteria, true)获取符合要求的供应商列表。
			 * 在没有搜索到足够卫星时，系统会返回其他方式，如network。
			 * 这种情况一般能保证定位成功，特殊情况除外
			 * */
			Criteria criteria = new Criteria();
			String betProvider = mLocationManager.getBestProvider(criteria, true);
			mLocationManager.isProviderEnabled(betProvider);
			if(isGpsopen&&betProvider!=null)
			{
				mLocation = mLocationManager.getLastKnownLocation(betProvider);
			}
		}
		
		//绑定监听，有4个参数    
        //参数1，设备：有GPS_PROVIDER和NETWORK_PROVIDER两种
        //参数2，位置信息更新周期，单位毫秒    
        //参数3，位置变化最小距离：当位置距离变化超过此值时，将更新位置信息    
        //参数4，监听    
        //备注：参数2和3，如果参数3不为0，则以参数3为准；参数3为0，则通过时间来定时更新；两者为0，则随时刷新   
        
        // 1秒更新一次，或最小位移变化超过1米更新一次；
        //注意：此处更新准确度非常低，推荐在service里面启动一个Thread，在run中sleep(10000);然后执行handler.sendMessage(),更新位置
		
		mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, mLocListener);
		//mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, mLocListener);
	}
	
	/**
	 * GPS设置界面
	 */
	private void openGpsActivity() {
		// TODO Auto-generated method stub
		
		Toast.makeText(this, "请开启GPS导航...", Toast.LENGTH_SHORT).show();
		Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
		startActivityForResult(intent, 0);
	}

	/**
	 * 对每一个提供商（provider）都进行定位，成功则返回
	 * 防止提供商（provider)没有卫星时,返回location为空
	 * 如果最后还是返回空可能是手机定位有问题，或一些特殊情况
	 */
	private Location getlocation(List<String> providerlist) {
		// TODO Auto-generated method stub
		Location location = null ;
		for(int i=0;i<providerlist.size();i++)
		{
			if(location==null)
			{
				location = mLocationManager.getLastKnownLocation(providerlist.get(i));
			}else
				return location;
		}
		return location;
	}

	protected void updateView(Location location) {
		// TODO Auto-generated method stub
		 if(location!=null){
	            mEditText.setText("设备位置信息\n\n经度：");
	            mEditText.append(String.valueOf(location.getLongitude()));
	            mEditText.append("\n纬度：");
	            mEditText.append(String.valueOf(location.getLatitude()));
	        }else{
	            //清空EditText对象
	        	mEditText.getEditableText().clear();
	        }
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub

	}
	/**
	 * 定位监听器，监听GPS状态
	 */
	private LocationListener mLocListener = new LocationListener() {
		
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
			switch (status) {
			//GPS状态为可见时
			case LocationProvider.AVAILABLE:
				 Log.i(TAG, "当前GPS状态为可见状态");
				break;
			//GPS状态为服务区外时
			case LocationProvider.OUT_OF_SERVICE:
				 Log.i(TAG, "当前GPS状态为服务区外状态");
				break;
			//GPS状态为暂停服务时
			default : 
				 Log.i(TAG, "当前GPS状态为暂停服务状态");
				break;
			}
		}
		/**
         * GPS开启时触发
         */
		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub
			mLocation = mLocationManager.getLastKnownLocation(provider);
			isGpsopen = true;
			updateView(mLocation);
		}
		/**
         * GPS禁用时触发
         */
		@Override
		public void onProviderDisabled(String arg0) {
			// TODO Auto-generated method stub
			isGpsopen = false;
			updateView(null);
		}
		/**
         * GPS重新定位
         */
		@Override
		public void onLocationChanged(Location location) {
			// TODO Auto-generated method stub
			mLocation = location;
			updateView(location);
		}
	};
	
	/**
     * 返回查询条件
     * 对查询条件进行精确设置
     */
    private Criteria getCriteria(){
        Criteria criteria=new Criteria();
        //设置定位精确度 Criteria.ACCURACY_COARSE比较粗略，Criteria.ACCURACY_FINE则比较精细 
        criteria.setAccuracy(Criteria.ACCURACY_FINE);    
        //设置是否要求速度
        criteria.setSpeedRequired(false);
        // 设置是否允许运营商收费  
        criteria.setCostAllowed(false);
        //设置是否需要方位信息
        criteria.setBearingRequired(false);
        //设置是否需要海拔信息
        criteria.setAltitudeRequired(false);
        // 设置对电源的需求  
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        return criteria;
    }
    
    /*
     * GPS状态监听，包括GPS启动、停止、第一次定位、卫星变化等事件。
     * */
    GpsStatus.Listener mGpsListener = new GpsStatus.Listener() {
		
		@Override
		public void onGpsStatusChanged(int event) {
			// TODO Auto-generated method stub
			switch (event) {
			case GpsStatus.GPS_EVENT_FIRST_FIX:
				 Log.i(TAG, "第一次定位");
				break;

			case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
				Log.i(TAG, "卫星状态改变");
				//获取当前状态
	            GpsStatus gpsStatus=mLocationManager.getGpsStatus(null);
	            //获取卫星颗数的默认最大值
	            int maxSatellites = gpsStatus.getMaxSatellites();
	            //创建一个迭代器保存所有卫星 
	            Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator();
	            int count = 0;     
	            while (iters.hasNext() && count <= maxSatellites) {     
	                 GpsSatellite s = iters.next();     
	                 count++;     
	            }   
				break;
			case GpsStatus.GPS_EVENT_STARTED:
				 Log.i(TAG, "定位启动");
				 isGpsopen = true;
				break;
			case GpsStatus.GPS_EVENT_STOPPED:
				 Log.i(TAG, "定位结束");
				 isGpsopen = false;
				break;
			default:
				
				break;
			}
		}
	};

	public int getFlag() {
		return flag;
	}

	public void setFlag(int flag) {
		this.flag = flag;
	}
    
}
